DATA_BLOCK DB 1
STRUCT
	Value		: INT
END_STRUCT
BEGIN
	Value		:= 8290
END_DATA_BLOCK


FUNCTION_BLOCK FB 1
BEGIN
	L		W#16#4321
	T		MW 0
END_FUNCTION_BLOCK


FUNCTION FC 1 : VOID
BEGIN
	L		W#16#1234
	T		MW 0
	CALL		FC 2
END_FUNCTION


FUNCTION FC 2 : VOID
BEGIN
	L		W#16#6789
	T		MW 0
	L		10
	T		LB 0
END_FUNCTION


FUNCTION FC 3 : VOID
BEGIN
	L		1
	T		LB 0
	CALL		FC 2
	__ASSERT==	LB 0,	1
END_FUNCTION


FUNCTION FC 4 : VOID
VAR_INPUT
	INPVAR		: INT
END_VAR
BEGIN
	L		#INPVAR
	__ASSERT==	__ACCU 1,	9976
END_FUNCTION


FUNCTION FC 5 : VOID
VAR_INPUT
	INPVAR2		: INT
END_VAR
BEGIN
	CALL FC 4 (
		INPVAR		:= #INPVAR2,	// This is a parameter
	)
END_FUNCTION


FUNCTION FC 6 : VOID
BEGIN
	// Only check OV and OS bits
	__ASSERT==	__STW OV,	1
	__ASSERT==	__STW OS,	0
	L		1
	L		1
	+I
	__ASSERT==	__STW OV,	0
	__ASSERT==	__STW OS,	0
END_FUNCTION


FUNCTION FC 7 : VOID
BEGIN
	// Trigger an overflow
	__ASSERT==	__STW OV,	0
	__ASSERT==	__STW OS,	0
	L		30000
	L		30000
	+I
	__ASSERT==	__STW OV,	1
	__ASSERT==	__STW OS,	1
END_FUNCTION


FUNCTION_BLOCK FB 10
VAR_INPUT
	INVAR1		: DWORD
	INVAR2		: INT
	//TODO more
END_VAR
VAR_OUTPUT
	RETURNVALUE	: INT
END_VAR
BEGIN
	L		#INVAR1
	__ASSERT==	__ACCU 1,	DW#16#88776655
	CALL FC 10 (
		INPUTVAR1	:= #INVAR1,
		INPUTVAR2	:= #INVAR2,
		INVAR_DB	:= DB1.DBW 0,
		RET_VAL		:= #RETURNVALUE,
	)
END_FUNCTION_BLOCK


DATA_BLOCK DB 10
FB 10
BEGIN
END_DATA_BLOCK


FUNCTION FC 10 : INT
VAR_INPUT
	INPUTVAR1	: DWORD
	INPUTVAR2	: INT
	INVAR_DB	: INT
	//TODO more
END_VAR
BEGIN
	L		#INPUTVAR1
	__ASSERT==	__ACCU 1,	DW#16#88776655
	L		P##INPUTVAR1
	UD		DW#16#FFF80000
	__ASSERT==	__ACCU 1,	DW#16#84000000

	L		#INPUTVAR2
	__ASSERT==	__ACCU 1,	8290

	L		#INVAR_DB
	__ASSERT==	__ACCU 1,	8290

	L		99
	T		#RET_VAL
	L		#RET_VAL
	__ASSERT==	__ACCU 1,	99
	L		P##RET_VAL
	UD		DW#16#FFF80000
	__ASSERT==	__ACCU 1,	DW#16#84000000

	CALL FC 11 (
		IN1	:= #INVAR_DB,
	)
END_FUNCTION


FUNCTION FC 11 : VOID
VAR_INPUT
	IN1		: INT
END_VAR
BEGIN
	L		#IN1
	__ASSERT==	__ACCU 1,	8290
END_FUNCTION


ORGANIZATION_BLOCK OB 1
BEGIN
	CALL		FC 1
	__ASSERT==	MW 0,	W#16#6789
	L		0
	T		MW 0
	__ASSERT==	MW 0,	0
	UC		FC 1
	__ASSERT==	MW 0,	W#16#6789
	L		0
	T		MW 0
	__ASSERT==	MW 0,	0
	SET
	CC		FC 1
	__ASSERT==	MW 0,	W#16#6789
	L		0
	T		MW 0
	__ASSERT==	MW 0,	0
	CLR
	CC		FC 1
	__ASSERT==	MW 0,	0

	// Test localdata stack
	L		255
	T		LB 0
	__ASSERT==	LB 0,	255
	CALL		FC 3
	__ASSERT==	LB 0,	255

	CALL FC 5 (
		INPVAR2		:= 9976,
	)

	// Test OV/OS bits over call boundaries
	__STWRST
	L		30000
	L		30000
	+I
	__ASSERT==	__STW OV,	1
	__ASSERT==	__STW OS,	1
	CALL FC 6
	__ASSERT==	__STW OV,	0
	__ASSERT==	__STW OS,	0
	__STWRST
	CALL FC 7
	__ASSERT==	__STW OV,	1
	__ASSERT==	__STW OS,	0


	// Test raw FB call
	L		0
	T		MW 0
	CLR
	UC		FB 1
	L		MW 0
	__ASSERT==	__ACCU 1,	W#16#4321
	L		0
	T		MW 0
	SET
	CC		FB 1
	L		MW 0
	__ASSERT==	__ACCU 1,	W#16#4321


	// Test indirect calls
	L		0
	T		MW 0
	L		1
	T		MW 50
	CLR
	UC		FC [MW 50]
	L		MW 0
	__ASSERT==	__ACCU 1,	W#16#6789
	L		0
	T		MW 0
	SET
	CC		FC [MW 50]
	L		MW 0
	__ASSERT==	__ACCU 1,	W#16#6789
	L		0
	T		MW 0
	CLR
	UC		FB [MW 50]
	L		MW 0
	__ASSERT==	__ACCU 1,	W#16#4321
	L		0
	T		MW 0
	SET
	CC		FB [MW 50]
	L		MW 0
	__ASSERT==	__ACCU 1,	W#16#4321


	// Test parameter forwarding (FB->FC)
	CALL FB 10, DB 10 (
		INVAR1		:= DW#16#88776655,
		INVAR2		:= DB1.DBW 0,
		RETURNVALUE	:= MW 0,
	)
	L		MW 0
	__ASSERT==	__ACCU 1,	99

END_ORGANIZATION_BLOCK
